#pragma once

#ifndef __OPENGL_QTWIDGET_H
#define __OPENGL_QTWIDGET_H

#include <unistd.h>

#include <QtWidgets/QWidget>
#include <QtGui/QOpenGLFunctions>
#include <QtWidgets/QOpenGLWidget>
#include <QtGui/QOpenGLShaderProgram>
#include <QtGui/QOpenGLBuffer>
#include <QtGui/QOpenGLTexture>
#include <QLabel>

class OpenGLQtWidget
	: public QOpenGLWidget, protected QOpenGLFunctions
{
public:
	OpenGLQtWidget(QWidget *parent = NULL);
	virtual ~OpenGLQtWidget();

	void set_data(unsigned char *buf, int width, int height);

protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();

    void initializeGL2();
    void initializeGL3();
    void paintGL2();
    void paintGL3();

    void initializeGLEasy();
    void paintGLEasy();

    void initializeGL4();
    void paintGL4();
private:
	unsigned char *yuvPtr;
	int            videoW;
	int            videoH;

	bool           m_first_open;

	GLuint textureUniformY; //y��������λ��
	GLuint textureUniformU; //u��������λ��
	GLuint textureUniformV; //v��������λ��
	GLuint id_y; //y�������ID
	GLuint id_u; //u�������ID
	GLuint id_v; //v�������ID
	QOpenGLTexture* m_pTextureY;  //y�������
	QOpenGLTexture* m_pTextureU;  //u�������
	QOpenGLTexture* m_pTextureV;  //v�������
	QOpenGLShader *m_pVSHader;  //������ɫ���������
	QOpenGLShader *m_pFSHader;  //Ƭ����ɫ������
	QOpenGLShaderProgram *m_pShaderProgram; //��ɫ����������

	GLuint m_textureUniformY;
	GLuint m_textureUniformU;
	GLuint m_textureUniformV;
	GLuint m_idy;
	GLuint m_idu;
	GLuint m_idv;
    QOpenGLShaderProgram m_program;

    GLuint y_texture;
    GLuint uv_texture;

    unsigned char* y_data;
    unsigned char* uv_data;

    GLuint idY,idUV; //Y分量和UV分量的纹理id
    QOpenGLBuffer vbo; //用于在opengl服务端创建数据
    qreal   m_fAngle;
    qreal   m_fScale;

    GLuint verVbo;
    GLuint indexVbo;
    GLuint colorVbo;
    GLuint matrixLocation;
    GLuint clorLocation;
    GLuint vertexLocation;
    GLsizei triIndexLen;
    QMatrix4x4 projection;

    QOpenGLShaderProgram *program;
    QOpenGLTexture *textureY = nullptr,*textureU = nullptr,*textureV = nullptr;
    QLabel m_label;
};

#endif
